
package org.odmg;

/**
* The interface for interacting with an ODMG database.
* Databases must be opened before starting any transactions that use the database
* and closed after ending these transactions.
* <p>
* A database application generally begins processing by accessing one or more
* critical objects and proceeding from there. These objects are root objects,
* because they lead to interconnected webs of other objects.
* The ability to name an object (using method <code>bind</code>) and
* retrieve it later by that name (using method <code>lookup</code> facilitates
* this start-up capability. A name is not explicitly defined as an attribute of
* an object. Naming an object also makes it persistent.
* <p>
* There is a single flat name scope per database; thus all names in a particular
* database are unique.
* @author	David Jordan (as Java Editor of the Object Data Management Group)
* @version ODMG 3.0
*/

public interface Database {
/**
* The database is not open.
*/
	public static final int NOT_OPEN = 0;

/**
* The database is opened for read-only access.
*/
	public static final int OPEN_READ_ONLY = 1;

/**
* The database is opened for reading and writing.
*/
	public static final int OPEN_READ_WRITE = 2;

/**
* The database is open for exclusive access.
*/
	public static final int OPEN_EXCLUSIVE = 3;

/**
* Open the named database with the specified access mode.
* Attempts to open a database when it has already been opened will result in
* the throwing of the exception <code>DatabaseOpenException</code>.
* A <code>DatabaseNotFoundException</code> is thrown if the database does not exist.
* Some implementations may throw additional exceptions that are also derived from
* <code>ODMGException</code>.
* @param	name	The name of the database.
* @param	accessMode	The access mode, which should be one of the static fields:
* <code>OPEN_READ_ONLY</code>, <code>OPEN_READ_WRITE</code>,
* or <code>OPEN_EXCLUSIVE</code>.
* @exception	ODMGException	The database could not be opened.
*/
	public	void		open(String name, int accessMode) throws ODMGException;

/**
* Close the database.
* After you have closed a database, further attempts to access objects in the
* database will cause the exception <code>DatabaseClosedException</code> to be thrown.
* Some implementations may throw additional exceptions that are also derived
* from <code>ODMGException</code>.
* @exception ODMGException Unable to close the database.
*/
	public	void		close() throws ODMGException;

/**
* Associate a name with an object and make it persistent.
* An object instance may be bound to more than one name.
* Binding a previously transient object to a name makes that object persistent.
* @param	object	The object to be named.
* @param	name	The name to be given to the object.
* @exception org.odmg.ObjectNameNotUniqueException
* If an attempt is made to bind a name to an object and that name is already bound
* to an object.
*/
	public	void		bind(Object object, String name) throws ObjectNameNotUniqueException;

/**
* Lookup an object via its name.
* @param	name	The name of an object.
* @return The object with that name.
* @exception	ObjectNameNotFoundException	There is no object with the specified name.
* @see	ObjectNameNotFoundException
*/
	public	Object		lookup(String name) throws ObjectNameNotFoundException;

/**
* Disassociate a name with an object
* @param	name	The name of an object.
* @exception	ObjectNameNotFoundException	No object exists in the database with that name.
*/
	public	void		unbind(String name) throws ObjectNameNotFoundException;

/**
* Make a transient object durable in the database.
* It must be executed in the context of an open transaction.
* If the transaction in which this method is executed commits,
* then the object is made durable.
* If the transaction aborts,
* then the makePersistent operation is considered not to have been executed,
* and the target object is again transient.
* ClassNotPersistenceCapableException is thrown if the implementation cannot make
* the object persistent because of the type of the object.
* @param	object	The object to make persistent.
*
* @throws ClassNotPersistenceCapableException if the object is not persistable.
*/
  public	void		makePersistent(Object object);

/**
* Deletes an object from the database.
* It must be executed in the context of an open transaction.
* If the object is not persistent, then ObjectNotPersistent is thrown.
* If the transaction in which this method is executed commits,
* then the object is removed from the database.
* If the transaction aborts,
* then the deletePersistent operation is considered not to have been executed,
* and the target object is again in the database.
* @param	object	The object to delete.
*
* @throws ObjectNotPeristentException (unchecked) if object does not exist in the extent.
*/
  public	void		deletePersistent(Object object);
}

